package com.atguigu.juc.day04.cf;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

public class Demo01FutureCancel {

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        // 1、在 Callable 对象中封装我们希望在线程中执行的代码
        Callable<String> callable = ()->{

            TimeUnit.MINUTES.sleep(5);

            return "task normal result";
        };

        // 2、把 Callable 对象封装到 FutureTask 对象中
        FutureTask<String> futureTask = new FutureTask<>(callable);

        // 3、把 FutureTask 对象封装 Thread 对象中启动线程
        new Thread(futureTask).start();

        // 4、主线程等待一段时间后，取消任务
        TimeUnit.SECONDS.sleep(5);
        futureTask.cancel(true);

        // 5、判断任务是否已经被取消
        boolean cancelled = futureTask.isCancelled();
        System.out.println("cancelled = " + cancelled);

        // ※重大问题：任务一旦取消，调用 get() 方法就无法获取任务结果，
        // 连兜底值（和预期类型一致的）都拿不到，甚至还抛出异常：java.util.concurrent.CancellationException
        String taskResult = futureTask.get();
        System.out.println("taskResult = " + taskResult);

    }

}
